#!/usr/bin/python3
import tkinter as tk
from tkinter import filedialog, messagebox

"""
参数解释
1. grid布局参数：
    - row和column：指定组件放置的行和列。
    - padx和pady：设置组件的外边距（水平和垂直方向的间距）。
    - sticky：指定组件如何填充单元格。例如：
        - "ew"：组件宽度会填充整个单元格（水平方向）。
        - "nsew"：组件会填充整个单元格（水平和垂直方向）。
    - columnspan和rowspan：指定组件跨越的列数或行数。
2. pack布局参数：
    - padx和pady：设置组件的外边距。
    - fill：指定组件如何填充空间。例如：
        - "x"：水平方向填充。
        - "y"：垂直方向填充。
        - "both"：水平和垂直方向填充。
    - expand=True：允许组件随窗口大小变化而扩展。
3. Label和Button参数：
    - text：设置标签或按钮的文本内容。
    - command：指定按钮点击时触发的函数。
4. Entry和Text参数：
    - width和height：设置输入框的宽度和高度。
    - wraplength：设置标签的换行宽度。
5. filedialog.askopenfilename()：
    - 打开文件选择对话框，返回用户选择的文件路径。
6. messagebox.showinfo()：
    - 弹出消息框，显示提示信息。
"""


class ToolApp:
    def __init__(self, root):
        # 初始化主窗口
        self.root = root
        self.root.title("小工具集合")  # 设置窗口标题
        self.root.geometry("600x400")  # 设置窗口初始大小为600x400

        # 初始化主界面
        self.create_main_interface()

    def create_main_interface(self):
        # 清空当前窗口的所有内容
        self.clear_window()

        # 创建主界面内容
        self.main_frame = tk.Frame(self.root)  # 创建一个Frame作为主界面的容器
        self.main_frame.pack(pady=20)  # 使用pack布局，上下留出20像素的间距

        # 使用grid布局管理器，将主界面分为两列
        self.main_frame.grid_columnconfigure(0, weight=1)  # 设置第0列的权重为1，使其可以随窗口大小变化
        self.main_frame.grid_columnconfigure(1, weight=1)  # 设置第1列的权重为1

        # 创建工具A的入口按钮
        self.tool_a_button = tk.Button(self.main_frame, text="工具A", command=self.open_tool_a)
        # 使用grid布局，将按钮放置在第0行第0列，左右留出20像素间距，上下留出10像素间距
        self.tool_a_button.grid(row=0, column=0, padx=20, pady=10, sticky="ew")  # sticky="ew"表示按钮宽度会填充整个单元格

        # 创建工具B的入口按钮
        self.tool_b_button = tk.Button(self.main_frame, text="工具B", command=self.open_tool_b)
        # 使用grid布局，将按钮放置在第0行第1列
        self.tool_b_button.grid(row=0, column=1, padx=20, pady=10, sticky="ew")

    def open_tool_a(self):
        # 清空当前窗口的所有内容
        self.clear_window()

        # 创建工具A界面
        self.tool_a_frame = tk.Frame(self.root)  # 创建一个Frame作为工具A界面的容器
        # 使用pack布局，上下左右留出20像素的间距，填充整个窗口，并随窗口大小变化
        self.tool_a_frame.pack(pady=20, padx=20, fill="both", expand=True)

        # 使用grid布局管理器，设置列和行的权重
        self.tool_a_frame.grid_columnconfigure(0, weight=1)  # 设置第0列的权重为1
        self.tool_a_frame.grid_columnconfigure(1, weight=1)  # 设置第1列的权重为1
        self.tool_a_frame.grid_rowconfigure(5, weight=1)  # 设置第5行的权重为1，用于多行文本框的布局

        # 文件选择控件
        self.file_label = tk.Label(self.tool_a_frame, text="选择文件：")  # 创建标签
        # 使用grid布局，放置在第0行第0列，靠左对齐，上下留出5像素间距
        self.file_label.grid(row=0, column=0, sticky="w", pady=5)

        self.file_button = tk.Button(self.tool_a_frame, text="选择文件", command=self.select_file)
        # 使用grid布局，放置在第0行第1列，左右留出10像素间距，上下留出5像素间距
        self.file_button.grid(row=0, column=1, padx=10, pady=5)

        self.file_path_label = tk.Label(self.tool_a_frame, text="未选择文件", wraplength=400)
        # 使用grid布局，放置在第1行第0列和第1列，左右填充，上下留出5像素间距
        self.file_path_label.grid(row=1, column=0, columnspan=2, sticky="ew", pady=5)

        # 数值输入框
        self.number_label = tk.Label(self.tool_a_frame, text="输入数值：")  # 创建标签
        self.number_label.grid(row=2, column=0, sticky="w", pady=5)  # 放置在第2行第0列

        self.number_entry = tk.Entry(self.tool_a_frame)  # 创建单行输入框
        self.number_entry.grid(row=2, column=1, pady=5)  # 放置在第2行第1列

        # 单行文本框
        self.single_line_label = tk.Label(self.tool_a_frame, text="单行文本：")
        self.single_line_label.grid(row=3, column=0, sticky="w", pady=5)

        self.single_line_entry = tk.Entry(self.tool_a_frame)
        self.single_line_entry.grid(row=3, column=1, pady=5)

        # 多行文本框
        self.multi_line_label = tk.Label(self.tool_a_frame, text="多行文本：")
        self.multi_line_label.grid(row=4, column=0, sticky="w", pady=5)

        self.multi_line_text = tk.Text(self.tool_a_frame, height=5, width=40)  # 创建多行文本框
        # 使用grid布局，放置在第5行第0列和第1列，填充整个单元格，上下留出5像素间距
        self.multi_line_text.grid(row=5, column=0, columnspan=2, sticky="nsew", pady=5)

        # 确定按钮
        self.confirm_button = tk.Button(self.tool_a_frame, text="确定", command=self.on_tool_a_confirm)
        self.confirm_button.grid(row=6, column=0, padx=10, pady=10, sticky="ew")  # 放置在第6行第0列

        # 返回按钮
        self.back_button = tk.Button(self.tool_a_frame, text="返回", command=self.create_main_interface)
        self.back_button.grid(row=6, column=1, padx=10, pady=10, sticky="ew")  # 放置在第6行第1列

    def select_file(self):
        # 打开文件选择对话框
        file_path = filedialog.askopenfilename()
        if file_path:  # 如果用户选择了文件
            self.file_path_label.config(text=file_path)  # 更新文件路径标签的文本

    def on_tool_a_confirm(self):
        # 获取用户输入的内容
        file_path = self.file_path_label["text"]  # 获取文件路径
        number = self.number_entry.get()  # 获取数值输入框的内容
        single_line = self.single_line_entry.get()  # 获取单行文本框的内容
        multi_line = self.multi_line_text.get("1.0", tk.END)  # 获取多行文本框的内容

        # 弹出消息框显示输入内容
        messagebox.showinfo("工具A结果", f"文件路径: {file_path}\n数值: {number}\n单行文本: {single_line}\n多行文本: {multi_line}")

    def open_tool_b(self):
        # 清空当前窗口的所有内容
        self.clear_window()

        # 创建工具B界面
        self.tool_b_frame = tk.Frame(self.root)
        self.tool_b_frame.pack(pady=20, padx=20, fill="both", expand=True)

        # 使用grid布局管理器
        self.tool_b_frame.grid_columnconfigure(0, weight=1)  # 设置第0列的权重为1
        self.tool_b_frame.grid_rowconfigure(1, weight=1)  # 设置第1行的权重为1

        # 多行文本框
        self.multi_line_label_b = tk.Label(self.tool_b_frame, text="多行文本：")
        self.multi_line_label_b.grid(row=0, column=0, sticky="w", pady=5)

        self.multi_line_text_b = tk.Text(self.tool_b_frame, height=10, width=40)
        self.multi_line_text_b.grid(row=1, column=0, sticky="nsew", pady=5)

        # 开始按钮
        self.start_button = tk.Button(self.tool_b_frame, text="开始", command=self.on_tool_b_start)
        self.start_button.grid(row=2, column=0, padx=10, pady=10, sticky="ew")

        # 返回按钮
        self.back_button = tk.Button(self.tool_b_frame, text="返回", command=self.create_main_interface)
        self.back_button.grid(row=3, column=0, padx=10, pady=10, sticky="ew")

    def on_tool_b_start(self):
        # 获取多行文本框的内容
        multi_line = self.multi_line_text_b.get("1.0", tk.END)
        # 弹出消息框显示内容
        messagebox.showinfo("工具B结果", f"多行文本内容:\n{multi_line}")

    def clear_window(self):
        # 清空当前窗口的所有内容
        for widget in self.root.winfo_children():
            widget.destroy()


if __name__ == "__main__":
    root = tk.Tk()  # 创建主窗口
    app = ToolApp(root)  # 初始化应用程序
    root.mainloop()  # 启动主事件循环
